import multiprocessing
from multiprocessing import Pool, Process


class BaseMProcessing(object):

    def __init__(self):
        self.pool = None

    def set_pool(self, num):
        #  with Pool(5) as p:
        self.pool = Pool(num)

    def set_process(self, group=None, target=None, name=None, args=(), kwargs={},
                    daemon=None):
        """
        产生一个进程，可以使用start() 方法调用
        :param group:
        :param target:
        :param name:
        :param args:
        :param kwargs:
        :param daemon:
        :return:
        """
        self.process = Process(group=group, target=target, name=name, args=args, kwargs=kwargs,
                               daemon=daemon)

    def set_start_method(self):
        """
        spawn: 在 Unix 和 Windows 上可用。Windows 和 macOS 上的默认设置。
        fork: 仅在 Unix 上可用。Unix 上的默认设置。
        forkserver: 在支持通过 Unix 管道传递文件描述符的 Unix 平台上可用。
        :return:
        """
        multiprocessing.set_start_method('spawn')

    def set_pipe(self):
        """
        send()和 recv() 发送和接收
        :return:
        """
        self.parent_conn, self.child_conn = multiprocessing.Pipe()

    def set_local(self):
        """
        进程锁
         l.acquire() 锁
          l.release() 释放锁
        :return:
        """
        self.lock = multiprocessing.Lock()

    def set_value(self, v):
        """
        创建和时使用的'd'和'i'参数是模块使用的类型的类型代码
        表示双精度浮点数并表示有符号整数。
        整数用 i, 字符用 c，浮点数用 d，其他类型： https://docs.python.org/3.6/library/array.html
        v 为0.0 表示浮点
        :param v:
        :return:
        """
        self.num = multiprocessing.Value('d', v)

    def set_array(self, lists):
        self.arr = multiprocessing.Array('i', lists)

    def set_mp_queue(self, maxsize=0):
        """
        多进程队列，ctx 为上下文对象
        ctx = mp.get_context('spawn')
         q = ctx.Queue()
        :param maxsize:
        :return:
        """
        self.queue = multiprocessing.Queue(maxsize=maxsize)

    def pool_map(self, func, iterable, chunksize=None):
        """
        对' iterable '中的每个元素应用' func '，收集结果
        在返回的列表中。
        :return:
        """
        self.pool.map(func, iterable, chunksize=chunksize)


    def set_manager(self):
        """
        with Manager() as manager:
        :return:
        """
        self.manager = multiprocessing.Manager()